﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main(void)
{
	{
		/*
			sizeof 计算变量所占内存内存空间⼤⼩的，单位是字节，如果操作数是类型的话，计算的是使⽤类型创建的变量所占内存空间的⼤⼩。
			sizeof 只关注占⽤内存空间的⼤⼩，不在乎内存中存放什么数据。
			strlen 是C语⾔库函数，功能是求字符串⻓度。函数原型如下：
			size_t strlen ( const char * str );
			统计的是从 strlen 函数的参数 str 中这个地址开始向后， \0 之前字符串中字符的个数。
			strlen 函数会⼀直向后找 \0 字符，直到找到为⽌，所以可能存在越界查找
		
		*/
		char arr1[] = { 'a','b','c' };
		char arr2[] = "abc";
		int arr3[] = { 1,2,3,4 };
		printf("%zd\n", sizeof(arr1));
		printf("%zd\n", strlen(arr1));
		printf("%zd\n", sizeof(arr2));
		printf("%zd\n", strlen(arr2));
		printf("%zd\n", strlen(arr3));//拆分成字节遇到0="\0"
		system("cls");
	}
	{
		/*
			一维数组
			数组名是数组首元素的地址，但是有两个例外
			1.&arr
			2.sizeof(arr)	
		*/
		int a[] = { 1,2,3,4 };
		printf("%zd\n", sizeof(a));
		printf("%zd\n", sizeof(a + 0));
		printf("%zd\n", sizeof(*a));
		printf("%zd\n", sizeof(a + 1));
		printf("%zd\n", sizeof(a[1]));
		printf("%zd\n", sizeof(&a));
		printf("%zd\n", sizeof(*&a));
		printf("%zd\n", sizeof(&a + 1));
		printf("%zd\n", sizeof(&a[0]));
		printf("%zd\n", sizeof(&a[0] + 1));

	}
	{
		char arr[] = { 'a','b','c','d','e','f' };
		printf("%d\n", sizeof(arr));
		printf("%d\n", sizeof(arr + 0));
		printf("%d\n", sizeof(*arr));
		printf("%d\n", sizeof(arr[1]));
		printf("%d\n", sizeof(&arr));
		printf("%d\n", sizeof(&arr + 1));
		printf("%d\n", sizeof(&arr[0] + 1));

	}
	{

		char arr[] = { 'a','b','c','d','e','f' };
		printf("%d\n", strlen(arr));
		printf("%d\n", strlen(arr + 0));
		printf("%d\n", strlen(*arr));
		printf("%d\n", strlen(arr[1]));
		printf("%d\n", strlen(&arr));
		printf("%d\n", strlen(&arr + 1));
		printf("%d\n", strlen(&arr[0] + 1));
	}
	return 0;
}